home *** CD-ROM | disk | FTP | other *** search
- #if !defined(USEDUMP)
- #include "lprlib.h"
- #include "lprdef.h"
- #include "lprfuncs.h"
- #else
- #pragma load "lprDumpFile"
- #endif
-
- extern unsigned char * filelist; /* pointer to list of files to process */
- extern unsigned char sbuf[]; /* tcp send buffer */
- extern short sbuflen; /* size of send buffer */
- extern unsigned char setmsg1[];
- extern unsigned char setmsg2[];
- extern unsigned long filesize; /* total number of data bytes we send */
- extern short prtfcount; /* count of files printed */
- extern settings_list cs, ds;
- extern short vnum; /* volume number to use */
- extern unsigned char countonly;
- extern unsigned char pend_conn; /* connection pending status */
- extern unsigned char prtstat[];
- unsigned char * currfname;
- short currfnum;
- FileParam currfp;
- unsigned char tt1[81]; /* title lines */
- unsigned char tt2[81];
- unsigned short pageno;
- unsigned char currline[130];
- unsigned char fbuf[512]; /* buffer for reading file data */
- short fbuflen; /* count of characters in fbuf */
- short fbufptr; /* offset for next character */
- unsigned char fileeof; /* eof flag for newchar */
-
- OSErr prtformat(void)
- {
- short i;
- OSErr rc;
-
- currfname = filelist; /* loop through each file */
- sbuflen = 0;
- rc = 0;
- if (countonly) filesize = 0;
- while (currfname[0] != 0) {
- i = 0;
- while (currfname[i] != 0x0d) i++;
- if (i == 0) { /* skip blank lines */
- currfname = currfname + 1;
- continue;
- }
- currfname[i] = 0; /* terminate name */
- sprintf(setmsg1, "starting new file: \"%s\"", currfname);
- putln(setmsg1);
- /* handle control line */
- if (currfname[0] == '#') rc = docontrol(currfname+1);
- else { /* handle file name line */
- /* prepare first part of error messages */
- sprintf(setmsg1, "Error reading file \"%s\"", currfname);
- memset(&currfp, 0, sizeof(FileParam));
- currfp.ioNamePtr = (StringPtr)currfname;
- currfp.ioVRefNum = vnum;
- c2pstr(currfp.ioNamePtr);
- rc = PBGetFInfo((ParmBlkPtr)&currfp, 0);
- p2cstr(currfp.ioNamePtr);
- if (rc != 0) {
- sprintf(setmsg2, "Error %d getting file info", rc);
- seterr();
- }
- else {
- rc = fsrdopen(currfname, vnum, &currfnum);
- if (rc != 0) {
- sprintf(setmsg2, "Error %d opening file", rc);
- seterr();
- }
- else {
- if (prtfcount == 0) {
- rc = dofile(1); /* no form feed at beginning */
- }
- else {
- rc = dofile(cs.noff);
- }
- prtfcount++;
- FSClose(currfnum);
- }
- }
- }
- currfname[i] = 0x0d;
- if (rc != 0) break;
- currfname = currfname + i + 1;
- if (countonly) {
- sprintf(setmsg1, "filesize = %ld", filesize);
- putln(setmsg1);
- }
- }
- /* if still connected, attempt to send remaining data, */
- /* followd by null */
- if (countonly || (pend_conn == 0)) return(rc);
- sbuf[sbuflen++] = 0x00;
- tcpwrite(sbuf, sbuflen);
- sbuflen = 0;
- if (pend_conn == 0) if (rc == 0) rc = 8;
- return(rc);
- }
-
- OSErr docontrol(s)
- unsigned char * s;
- {
- sprintf(setmsg2, "docontrol data: \"%s\"", s);
- putln(setmsg2);
- return(0);
- }
-
- OSErr dofile(char noff)
- {
- OSErr rc;
- unsigned long eofsize, readsize, readact;
- unsigned char byte1;
- unsigned short i, wrc;
- unsigned short lineno;
- unsigned short top, pgsize;
-
- if (countonly) {
- sprintf(prtstat, "Calculating size of \"%s\"", currfname);
- statdlg(0, 0x04);
- }
- else {
- sprintf(prtstat, "Sending \"%s\" to host", currfname);
- statdlg(0, 0x04);
- }
-
- if (cs.fmttype != 2) { /* print file without doing formatting */
- /* get size of file */
- rc = GetEOF(currfnum, (long *)&eofsize);
- if (rc != 0) {
- sprintf(setmsg2, "Error %d getting file size", rc);
- seterr();
- return(rc);
- }
- /* write initial FF if not suppressed */
- if (!noff) {
- rc = fmtwrite("\014", 1);
- if (rc != 0) return(rc);
- }
- /* if empty file, write LF and return */
- if (eofsize == 0) {
- return(fmtwrite("\012", 1));
- }
- /* read first byte */
- readsize = 1;
- rc = FSRead(currfnum, (long *)&readsize, &byte1);
- if ((rc != 0) || (readsize != 1)) {
- if (rc == 0) rc = 4;
- sprintf(setmsg2, "Error %d reading file", rc);
- seterr();
- return(rc);
- }
- if (byte1 == 0x0d) byte1 = 0x0a;
- /* write first byte if not FF, or noff set */
- if (noff || (byte1 != 0x0c)) {
- rc = fmtwrite(&byte1, 1);
- if (rc != 0) return(rc);
- }
- eofsize--;
-
- if (countonly) {
- filesize += eofsize; /* add remaining size of file */
- /* add LF if file doesn't end with one */
- if (eofsize > 0) { /* already have last byte if eofsize = 0 */
- rc = SetFPos(currfnum, fsFromLEOF, -1L);
- if (rc != 0) {
- sprintf(setmsg2, "Error %d setting file position", rc);
- seterr();
- return(rc);
- }
- readsize = 1;
- rc = FSRead(currfnum, (long *)&readsize, &byte1);
- if ((rc != 0) || (readsize != 1)) {
- if (rc == 0) rc = 4;
- sprintf(setmsg2, "Error %d reading file", rc);
- seterr();
- return(rc);
- }
- if (byte1 == 0x0d) byte1 = 0x0a;
- }
- if (byte1 != 0x0a) filesize++; /* add CR if none at end */
- return(0);
- }
-
- while (eofsize > 0) { /* write remaining bytes */
- readsize = 512 - sbuflen;
- if (readsize > eofsize) readsize = eofsize;
- eofsize -= readsize;
- readact = readsize;
- rc = FSRead(currfnum, (long *)&readact, sbuf+sbuflen);
- if ((rc != 0) || (readsize != readact)) {
- sprintf(setmsg2, "Error %d reading file", rc);
- seterr();
- return(rc);
- }
- for (i=0; i < readsize; i++)
- if (sbuf[sbuflen+i] == 0x0d) sbuf[sbuflen+i] = 0x0a;
- if (eofsize == 0) byte1 = sbuf[sbuflen+readsize-1];
- sbuflen += readsize;
- if (sbuflen == 512) {
- tcpwrite(sbuf, 512);
- sbuflen = 0;
- if (pend_conn == 0) return(8);
- }
- }
-
- if (byte1 != 0x0a) {
- rc = fmtwrite("\012", 1);
- if (rc != 0) return(rc);
- }
-
- return(0);
- }
-
- else { /* print file with our own formatting */
- top = cs.ftop; /* get page parameters */
- if (top > 13 - MARGIN) top = 13 - MARGIN;
- pgsize = cs.fpgsize;
- if (pgsize == 0) pgsize = ds.fpgsize;
- if (pgsize < 16) pgsize = 16;
- maketitles(); /* construct titles to use */
- pageno = 0;
- lineno = 0;
- fbuflen = 0;
- fbufptr = 0;
- fileeof = 0;
- wrc = 0;
- while ((rc = getline()) == 0) {
- if (ctlline()) { /* all control lines start new pages */
- lineno = 0;
- continue;
- }
- if (lineno == 0) {
- if ((pageno > 0) || (prtfcount > 0)) {
- wrc = fmtwrite("\014", 1);
- if (wrc != 0) break;
- }
- wrc = skip(top);
- if (wrc != 0) break;
- pageno = pageno + 1;
- wrc = puthead();
- if (wrc != 0) break;
- wrc = skip(MARGIN);
- if (wrc != 0) break;
- lineno = top + MARGIN + 2; /* two heading lines */
- }
- wrc = putline();
- if (wrc != 0) break;
- lineno = lineno + 1;
- if (lineno >= pgsize) lineno = 0;
- }
- }
- if (wrc != 0) return(wrc);
- if (cs.duplex) {
- if (pageno%2) {
- lineno = 0;
- wrc = fmtwrite("\014", 1);
- if (wrc != 0) return(wrc);
- wrc = skip(top);
- if (wrc != 0) return(wrc);
- pageno = pageno + 1;
- wrc = puthead();
- if (wrc != 0) return(wrc);
- }
- }
- if (rc == eofErr) return(0);
- else return(rc);
- }
-
- void maketitles(void)
- {
- short tlen;
- DateTimeRec dtr;
- static unsigned char * days[7] = {
- "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
- static unsigned char * months[12] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
- "Aug", "Sep", "Oct", "Nov", "Dec"};
- static unsigned char am[3] = "AM";
- static unsigned char pm[3] = "PM";
- unsigned char * timeptr;
- short hours;
-
- /* first line */
- memset(tt1, 0x20, 79);
- tt1[79] = 0x0a;
- tt1[80] = 0;
- memcpy(tt1, "File: \"", 7);
- tlen = strlen(currfname);
- if (tlen > 63) tlen = 63;
- memcpy(tt1+7, currfname, tlen);
- if (tlen < 63) tt1[tlen+7] = '"';
- /* second line */
- if (cs.fmttitle[0] != 0) { /* use title given by user */
- tlen = strlen(cs.fmttitle);
- if (tlen > 79) tlen = 79;
- memcpy(tt2, cs.fmttitle, tlen);
- tt2[tlen] = 0x0a;
- tt2[tlen+1] = 0;
- return;
- }
- /* generate default title */
- Secs2Date(currfp.ioFlMdDat, &dtr);
- if (dtr.hour < 12) timeptr = am;
- else timeptr = pm;
- if (dtr.hour == 0) hours = 12;
- else if (dtr.hour > 12) hours = dtr.hour - 12;
- else hours = dtr.hour;
- sprintf(tt2, "Last Modified: %s, %s %d, %d %d:%02d:%02d %s\012",
- days[dtr.dayOfWeek-1], months[dtr.month-1], dtr.day, dtr.year,
- hours, dtr.minute, dtr.second, timeptr);
- }
-
- short puthead(void)
- {
- unsigned char pbuff[12];
- short i, rc, indent, width;
-
- indent = cs.findent;
- if (indent > 63) indent = 0;
- if (indent > 0) memset(currline, 0x20, indent);
-
- width = cs.fwidth;
- if (width == 0) width = ds.fwidth;
- if (width > 128) width = 128;
- if (width < 64) width = 64;
-
- memset(tt1+71, 0x20, 8);
- if (pageno > 999) sprintf(pbuff, "Page%4d", pageno%10000);
- else sprintf(pbuff, "Page %d", pageno);
- i = strlen(pbuff);
- memcpy(tt1+79-i, pbuff, i);
-
- if (indent > 0) for (i=0; i < indent; i++) {
- rc = fmtwrite(" ", 1);
- if (rc != 0) return(rc);
- }
- i = strlen(tt1) - 1;
- if (i > width - indent) i = width - indent;
- rc = fmtwrite(tt1, i);
- if (rc != 0) return(rc);
- rc = fmtwrite("\012", 1);
- if (rc != 0) return(rc);
-
- if (indent > 0) for (i=0; i < indent; i++) {
- rc = fmtwrite(" ", 1);
- if (rc != 0) return(rc);
- }
- i = strlen(tt2) - 1;
- if (i > width - indent) i = width - indent;
- rc = fmtwrite(tt2, i);
- if (rc != 0) return(rc);
- rc = fmtwrite("\012", 1);
- return(rc);
- }
-
- short skip(n)
- short n;
- {
- short i, rc;
-
- if (n <= 0) return(0);
- for (i = 0; i < n; i++) {
- rc = fmtwrite("\012", 1);
- if (rc != 0) return(rc);
- }
- return(0);
- }
-
- short putline(void)
- {
- return (fmtwrite(currline, strlen(currline)));
- }
-
- OSErr getline(void)
- {
- register short i, c, indent, width, tbsize;
- unsigned char tabflag;
-
- memset(currline, 0, 130);
-
- indent = cs.findent;
- if (indent > 63) indent = 0;
- if (indent > 0) memset(currline, 0x20, indent);
-
- width = cs.fwidth;
- if (width == 0) width = ds.fwidth;
- if (width > 128) width = 128;
- if (width < 64) width = 64;
-
- tabflag = 0;
- tbsize = cs.ftabsize;
- if (tbsize == 0) tbsize = ds.ftabsize;
- if (tbsize < 1) tbsize = 1;
- if (tbsize > 32) tbsize = 32;
-
- for (i = indent; i < width; i ++) {
- if (tabflag) {
- if ((i-indent)%tbsize == 0) {
- tabflag = 0;
- c = newchar();
- }
- else c = 0x20;
- }
- else c = newchar();
- if (c == 0x09) {
- c = 0x20;
- tabflag = 1;
- }
- if (c == 0x0a) break;
- if (c == eofErr) {
- if (i == indent) return(eofErr);
- else break;
- }
- else if (c < 0) return(c);
- currline[i] = c;
- }
- if (!cs.splitflag) while ((c >= 0) && (c != 0x0a)) c = newchar();
- strcat(currline, "\012");
- return(0);
- }
-
- short newchar(void)
- {
- long readact;
- register OSErr rc;
- register short c;
-
- if (fbufptr == fbuflen) {
- if (fileeof) return(eofErr);
- readact = 512;
- rc = FSRead(currfnum, &readact, fbuf);
- fbufptr = 0;
- fbuflen = readact;
- if (rc == eofErr) {
- fileeof = 1;
- if (readact == 0) return(eofErr);
- }
- else if (rc != 0) {
- fbuflen = 0;
- fileeof = 1;
- sprintf(setmsg2, "Error %d reading file", rc);
- seterr();
- return(rc);
- }
- }
- c = fbuf[fbufptr++];
- if (c == 0x0d) c = 0x0a;
- return(c);
- }
-
- OSErr fmtwrite(s, len)
- unsigned char * s;
- short len;
- {
- short currlen;
-
- if (countonly) {
- filesize += len;
- return(0);
- }
-
- while (len > 0) {
- currlen = 512 - sbuflen;
- if (currlen > len) currlen = len;
- memcpy(sbuf+sbuflen, s, currlen);
- s += currlen;
- len -= currlen;
- sbuflen += currlen;
- if (sbuflen == 512) {
- tcpwrite(sbuf, 512);
- sbuflen = 0;
- if (pend_conn == 0) return(8);
- }
- }
- return(0);
- }
-
- short ctlline(void)
- {
- short len1, len2, tlen;
- unsigned char * tok1;
- unsigned char savechar;
- unsigned char newtitle[81];
-
-
- if (!cs.pascalflag) return(0);
-
- tok1 = currline;
- while ((tok1[0] == ' ') || (tok1[0] == 0x09)) tok1++;
- if ((tok1[0] == 0) || (tok1[0] == 0x0a)) return(0);
- len1 = 1;
- while ((tok1[len1] != ' ') && (tok1[len1] != 0x09)
- && (tok1[len1] != 0x0a) && (tok1[len1] != 0)) len1++;
- savechar = tok1[len1];
- tok1[len1] = 0;
- if (0 == strcmp(tok1, "{EJECT}")) {
- if ((savechar == ' ') || (savechar == 0x09)) {
- len2 = len1 + 1;
- while ((tok1[len2] == ' ') || (tok1[len2] == 0x09)) len2++;
- if ((tok1[len2] != 0) && (tok1[len2] != 0x0a)) {
- tok1[len1] = savechar;
- return(0);
- }
- }
- return(1);
- }
- else if (0 == strcmp(tok1, "{TITLE")) {
- if ((savechar != ' ') && (savechar != 0x09)) {
- tok1[len1] = savechar;
- return(0);
- }
- len2 = len1 + 1;
- tlen = 0;
- while ((tok1[len2] != '}') && (tok1[len2] != 0x0a)
- && (tok1[len2] != 0)) {
- if (tlen < 79) newtitle[tlen++] = tok1[len2];
- len2++;
- }
- if (tok1[len2] != '}') {
- tok1[len1] = savechar;
- return(0);
- }
- len2++;
- while ((tok1[len2] == ' ') || (tok1[len2] == 0x09)) len2++;
- if ((tok1[len2] != 0) && (tok1[len2] != 0x0a)) {
- tok1[len1] = savechar;
- return(0);
- }
- if (tlen > 0) memcpy(tt2, newtitle, tlen);
- tt2[tlen] = 0x0a;
- tt2[tlen+1] = 0;
- return(1);
- }
- else {
- tok1[len1] = savechar;
- return(0);
- }
- }
-